iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 25
1
自我挑戰組

Junior Ruby on Rails 工程師的心得與自我挑戰 30 天 (單身狗轉移注意力之歷練)系列 第 25

[Day25] Ruby on Rails - 使用 change_column 碰的的問題分享

  • 分享至 

  • xImage
  •  

情景:在一個資料表裡,有 2 個欄位分別是 export_commentimport_comment,這兩個欄位的屬性是 string

問題:這兩位為 string 的欄位,當輸入超過 255 字元數時,網站會報錯,無法讓使用者繼續操作。

解決方法:修正為 text 型態,可儲存 65535 字元數。

步驟一:在我們的 Terminal 輸入 rails g migration change_comment_to_fd_documents,建立一個 Migration 檔案。

狀況一:這個寫法透過 rubocop 風格檢查,會跳出為 Rails/BulkChangeTable: You can use change_table :fd_documents, bulk: true to combine alter queries. 的錯誤,意思是要我們改用這種寫法。

class ChangeCommentToFDDocuments < ActiveRecord::Migration[5.2]
  change_column :fd_documents, :export_comment, :text
  change_column :fd_documents, :import_comment, :text
end

狀況二:按照狀況一的錯誤提示,將 Migration 檔案改寫,請參考如下。

class ChangeCommentToFDDocuments < ActiveRecord::Migration[5.2]
  change_table :fd_documents, bulk: true do |t|
    t.text :export_comment
    t.text :import_comment
  end
end

但是,在 Terminal 輸入 rails db:migrate 時,會出現 Mysql2::Error: Duplicate column name export_comment: ALTER TABLE fd_documents ADD export_comment text, ADD import_comment text 的錯誤訊息,這個大概的意思是,在我們的資料表裡,已重複 export_commentimport_comment 欄位。

狀況三:按照狀況一跟狀況二的錯誤訊息來看,我再次將 Migration 檔案改寫,請參考如下。

class ChangeCommentToFDDocuments < ActiveRecord::Migration[5.2]
  change_table :fd_documents, bulk: true do |t|
    change_column :fd_documents, :export_comment, :text
    change_column :fd_documents, :import_comment, :text
  end
end

但是,透過 rubocop 風格檢查,會跳出以下的錯誤訊息,意思是說我們不需要 t 這個參數時,則可以忽略它。

Lint/UnusedBlockArgument: Unused block argument - t. You can omit the argument if you don't care about it.
change_table :fd_documents, bulk: true do |t|
                                           ^

經過以上三種狀況的各個錯誤,我重新查詢了一下資料跟詢問資深的同事,得到了一些問題的點:

  1. 狀況一的寫法是可行的,但...只針對修改一個欄位。如果是針對兩個欄位做修改,就一定要採用迴圈式的寫法。
  2. 就算是採用迴圈式的寫法,但是我的寫法,其實是在建立新的欄位,而不是修改這樣。

最後,將 Migration 檔案重新改寫,就可以正常運作了。

# frozen_string_literal: true

class ChangeCommentToFDDocuments < ActiveRecord::Migration[5.2]
  def self.up
    change_column :fd_documents, :export_comment, :text
    change_column :fd_documents, :import_comment, :text
  end

  def self.down
    change_column :fd_documents, :export_comment, :string
    change_column :fd_documents, :import_comment, :string
  end
end

上一篇
[Day24] Ruby on Rails - Timezone Mapping 實作之碰到問題及解法
下一篇
[Day26] Ruby on Rails - 期待週末的來臨...
系列文
Junior Ruby on Rails 工程師的心得與自我挑戰 30 天 (單身狗轉移注意力之歷練)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言